function Foo() {
  getName = function () { console.log(1); };
  return this;
}

Foo.getName = function () { console.log(2); };

Foo.prototype.getName = function () { console.log(3); };

var getName = function () { console.log(4); };

function getName() { console.log(5); };

Foo.getName(); // 2 
getName(); // 4 函数表达式覆盖了函数声明
Foo().getName(); // 1 Foo() 执行 执行的时候声明了一个全局的getName函数 
// 返回了this 指向 window 此时window全局下的getName是刚刚执行Foo时声明的 所以结果是1
getName(); // 1 上一句执行后全局的getName覆盖了原来的函数表达式声明的getName 所以结果是 1

new Foo.getName(); // 2
// 执行顺序是 new Fn() => Fn() => new Fn
// 所以这里先执行的是 Foo.getName() 打印2 再对Foo.getName实例化

new Foo().getName(); // 3
// 先执行 new Foo() 得到Foo的一个实例 在执行实例上的getName

new new Foo().getName(); // 3
// 同上 先执行 new Foo() 得到Foo的一个实例 在执行实例上的getName
// 再对Foo().getName实例化
